#填充和步幅
#在所有侧边填充1个像素
import torch
from torch import nn
## 为了⽅便起⻅，我们定义了⼀个计算卷积层的函数。
# 此函数初始化卷积层权重，并对输⼊和输出提⾼和缩减相应的维数
def comp_conv2d(conv2d, X):
    # 这⾥的（1，1）表⽰批量⼤⼩和通道数都是1
    X = X.reshape((1, 1) + X.shape)
    Y = conv2d(X)
    # 省略前两个维度：批量⼤⼩和通道
    return Y.reshape(Y.shape[2:])
# 请注意，这⾥每边都填充了1⾏或1列，因此总共添加了2⾏或2列
#核是3X3
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)#padding填充
X = torch.rand(size=(8, 8))
print(comp_conv2d(conv2d, X).shape)
#填充不同的高度和宽度
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
print(comp_conv2d(conv2d, X).shape)

#将高度和宽度的步幅设置为2
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)#步幅
print(comp_conv2d(conv2d, X).shape)
#一个稍微复杂的例子
#当卷积核的⾼度和宽度不同时，我们可以填充不同的⾼度和宽度，使输出和输⼊具有相同的⾼度和宽度。在
#如下⽰例中，我们使⽤⾼度为5，宽度为3的卷积核，⾼度和宽度两边的填充分别为2和1。
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
print(comp_conv2d(conv2d, X).shape)


